Visual Effect Graph示例项目
Visual Effect Graph能够帮助我们创作新一代视觉效果,它使用了基于节点的工作流程和在GPU运行的计算着色器。
我们在《使用Visual Effect Graph创作惊艳的视觉效果》中介绍过该工具的使用。自从在Unite LA 2018发布Visual Effect Graph预览版以来,我们一直在向项目中添加许多VFX示例。
这些示例展示了Visual Effect Graph可以处理的不同制作条件,包括从简单的粒子系统到带有特定行为较为复杂的系统。现在你可以下载及查看这些示例,并使用它们来创作属于你的视觉特效。
下载示例项目
请确保使用Unity 2018.3,版本越新,运行效果越好。建议使用Unity Hub来获取最新版本。Visual Effect Graph示例项目可运行于Windows和Mac系统的编辑器。
请访问Visual Effect Graph项目页,获取源代码Zip压缩包或Tar.gz压缩包:
https://github.com/Unity-Technologies/VisualEffectGraph-Samples/releases
示例项目结构
所有示例都位于Assets/Samples目录下。主场景位于/Assets根目录,在构建播放器时使用,主场景用于按顺序加载Build Settings窗口中场景构建列表所指定的所有示例。
如果需要构建播放器,请确保在构建设置的索引0处加入VisualEffectsSamples场景,然后添加其它要处理的场景。
示例项目
示例1:Unity Cube
Unity Cube示例是使用早期版本Visual Effect Graph制作的第一批效果之一。它展示了一个由40万个粒子组成的系统,其中有一个移动的发射源吸引着粒子朝着Unity体积立方体移动。
发射球体和运动过程在整个效果中是独立的,我们使用了每条轴的sin(Time)值来改变球体的位置。这项计算的有趣之处在于我们可以确定子帧位置,以减少球体位置的离散化。
我们可以开启和关闭选项来查看二个模式的区别。在下面示例中,当仅使用时间的时候,球体的移动速度非常快,我们会看到球体形状在空间中离散化。然而,当使用Per-Particle总体时间的时候,这种瑕疵会完全消失。
一旦粒子被球体释放出来,粒子会受到二个向量场作用:一个是朝着Unity立方体的吸引场;另一个是在被吸引时丰富运动效果的噪声场。粒子也会和发射球体相互碰撞。
粒子的颜色由二个梯度控制:一个用于处理运动中发射球体附近的粒子,周期为5秒;另一个梯度是蓝色变粉色的标准生命周期颜色。
通过使用这种遮罩技巧,我们模拟发射源对附近粒子应用的伪光照效果。
示例2:Morphing Face
Morphing Face变形的脸示例展示了,使用点缓存来设置粒子初始位置,同时保存法线等其它属性的功能。
粒子会从我们使用Houdini烘焙的点缓存随机生成,但我们也可以使用点缓存烘焙工具从Unity网格生成该点缓存,该工具可通过依次点击Window/Visual Effects/Utilities/Point Cache Bake Tool打开。
点缓存文件会导入Unity,根据属性生成带有一个纹理的资源。我们可以使用Point Cache节点来引用该资源,它将填充所有属性图,并连接每个属性。
然后我们可以把这些内容加到Attribute from Map块来获取这些数值。在示例中,我们从点缓存随机采样了多个点来创建粒子。
一旦创建,这些粒子不会在模拟效果中更新,粒子会固定在空间中,不会变化或消失。我们会在输出的Context环境计算随时间变化的遮罩,在上图中显示为绿色和红色。
这种遮罩可以让我们控制粒子的许多参数,使它们从二个状态混合:小型非金属立方体和较长的金属棒。朝向也会混合在对齐的立方体和随机方向的棒状物之间。
场景还使用了移动光线来显示材质变化,同时改变遮罩效果。
示例3:Butterflies
Butterflies蝴蝶示例是使用多项输出来渲染一个粒子的示例。在该示例中,我们模拟了围绕中心垂直轴旋转的一群蝴蝶。
每个蝴蝶都由一个粒子元素定义,仅在更新的Context环境模拟它的轨迹。在下面的示例中,蝴蝶粒子由红点突出显示。
翅膀和身体的动画会在3个不同的输出Context环境中计算,其中二个用于翅膀,一个用于身体。为了确定蝴蝶的方向,我们使用向前的(速度)向量和朝后倾斜的上向量,使蝴蝶身体不和轨迹对齐,而是使头部相对腹部向上偏移。
身体的动画使用正弦函数处理,正弦函数使用因蝴蝶而异的随机频率。翅膀角度也使用相同频率的正弦函数处理,但是会在时间上稍微偏移,以模拟出身体的阻力和惯性效果。
示例4:Grass Wind
Grass Wind草和风示例展示和常见粒子完全不同的模拟效果,即地形中草的效果。我们使用从地形数据生成的点缓存在地形生成草场,它带有由地形法线和世界空间上向量混合的朝上向量。
每个元素通过使用Position,Radius和Velocity参数实现与玩家交互,这些参数会被发送到效果中,并基于玩家的角色数值进行处理。
模拟效果由以下规则控制:
玩家范围内的植物会朝玩家的移动方向弯曲。
已经弯曲的植物不会受到影响,因此踩在这些植物上面不会影响它们的效果。
随着时间推移,植物会重新恢复原始方向。
为了模拟作物弯曲的效果,我们把数值保存到未使用的Velocity和Alpha属性中。
Velocity速度属性保存作物的弯曲方向。
Alpha属性保存弯曲状态:Alpha值为1.0表示作物的直立状态;0.0表示作物完全弯曲;最小值-2.0和0.0的状态相同,用于使作物有额外的弯曲时间。
踩在作物上时,Alpha属性值会以特定速度减小,直到数值达到最小值-2.0。没有踩在作物上时,作物会以特定速度增大,直到数值为1.0。当从0.0过渡1.0时,速度值会释放并减小,直到作物恢复直立状态。
对于没有受到踩踏和弯曲的作物,我们在输出应用了额外的风噪声,使它们闲置时不完全处于静止状态。
示例5:Volumetric
Volumetric体积示例比较简单,但它展示了与高清晰渲染管线和体积雾的集成效果。场景设置为分割环境,其背景天空是纯灰色。场景中使用了二个光源,一个为橙色,另一个为蓝色。
为了投射阴影,每个光源都由一个朝着摄像机的聚光灯组成,并开启了实时阴影效果。为了模拟准确的光源,我们为每个光源在相反方向配置了另一个聚光灯。
不透明粒子会从动态光源生成,它带有Flipbook纹理,会在每个粒子模拟出多个元素,这有助于我们保持较大的质量,同时不必使用六倍的粒子数量。
粒子质量使用噪声来变化,粒子会被吸引到摄像机附近的位置。粒子在渲染时启用了投射阴影,并使用漫反射配置文件和透光率,使光线会透过粒子。
下图是我们为示例使用的光照效果详解过程。
示例6:Portal
我们希望通过CG工具来仿制效果,并添加自己的改进。制作Portal示例,我们从RiseFX的Houdini作品得到了一些启发。
该效果包含一个粒子系统,一个内部扭曲圆圈和8个线形光组成的光照控件,它们都会在运行模式中进行旋转。
粒子在生成时会分成二个分组:快速旋转的圆环效果和碰撞粒子,所有粒子都会在地面发生碰撞。
示例7:AR Radar
AR雷达示例由许多系统协作实现的复杂效果,它同时具有内部序列和外部序列,外部序列通过使用范围在0到1的浮点参数Initialize来组成时间轴效果。
Initialize参数会在整个视图中多次使用,以控制初始化到网格时的部署效果。
通过图形多次使用此参数,以在初始化网格时控制部署效果:
从0.0到0.1时:它控制闪光点
从0.1到1.0时:网格和环境进行部署。
敌人飞船会在基本效果部署后触发,使用的是Timeline VFX Dedicated轨道。该轨道会多次发送一个事件,从而生成敌人飞船。
中心的闪光点由Position Parameter Binder脚本控制,该脚本会使闪光点关联到场景的点光源。
下图是分离效果。
示例8:Voxelized Terrain
VoxelizedTerrain体素地形是由粒子控制的高度场模拟效果,这些粒子都被渲染为立方体。
每个粒子都是大小为256×256的2D网格上的点,粒子会基于对象空间坐标从2D纹理采样。坐标可以进行偏移和缩放,使地形发生缩放和平移。
通过采样高度图并保存数值到Scale.y,我们可以改变所有点的效果,从而设置实际的采样Height高度,根据高度对立方体进行着色,然后调整它们的材质属性,例如:水面的光滑度。
我们可以调整水位,输入高度和最终高度。所有参数都是公开的,受到全局脚本VoxelizedTerrainController.cs控制。
该脚本会处理鼠标和键盘的事件,从而平移,缩放和旋转摄像机,并对Visual Effect组件设置所有参数。
该脚本使用了实用的ExposedParameter结构,它会缓存参数的字符串值,并从Shader.PropertyToID()返回整型索引。
dist = Mathf.Clamp(dist, CameraMinMaxDistance.x, CameraMinMaxDistance.y);
ViewingCamera.transform.position = CameraRoot.transform.position + dist * dir;
VisualEffect.SetVector2(Position, m_Position);
VisualEffect.SetVector2(WorldSize, m_WorldSize);
// 滑块
float inputHeightMapScale = Mathf.Lerp(InputHeightLevel.x, InputHeightLevel.y, InputHeightMapScaleSlider.value);
float elevation = Mathf.Lerp(ElevationRange.x, ElevationRange.y, ElevationSlider.value);
float waterElevation = Mathf.Lerp(WaterElevationRange.x, WaterElevationRange.y, WaterElevationSlider.value);
CameraRoot.transform.position = new Vector3(CameraRoot.transform.position.x, waterElevation, CameraRoot.transform.position.z);
ViewingCamera.transform.LookAt(CameraRoot.transform);
VisualEffect.SetFloat(InputHeightMapScale, inputHeightMapScale);
VisualEffect.SetFloat(Elevation, elevation);
VisualEffect.SetFloat(WaterElevation, waterElevation);
示例9:Genie
Genie精灵效果由许多系统组成,这些系统使用了一些相同的参数,通过使用内部序列来互相连接。该示例使用了一个简单的脚本来控制效果的打开和关闭,只需单击神灯即可。
该场景包含四个点,用于定义贝塞尔点,使魔力从神灯中流出。为了使粒子运动,我们没有使用速度值,而是使用了一个位置,它会在粒子的生命周期沿着贝塞尔移动,以及由向量场噪声计算的偏移。
贝塞尔曲线的最后一个点保存着精灵的位置,它会在视觉效果中使用3D正弦波动画生成。该点控制了精灵身体和眼睛的位置。
场景的设置使用了单个Timeline,以及控制精灵前后移动的控制组件。通过使用VFX Event Tracks,我们控制粒子生成的开始和停止。
此外,Timeline控制了Cinemachine摄像机的混合效果和简单的控制组件。
更多视觉效果和示例
所有新示例都将在Visual Effect Graph资源包(5.x.x-preview)的Unity 2019.1发布周期推出。
这意味着现在的所有示例都属于新发布周期的一部分,但我们不再会对Unity 2018.3的示例进行更新。请持续关注,第一时间获取我们为Unity 2019.1发布的新示例。更多视觉效果即将推出,敬请期待。
更多Unity最新功能介绍,尽在Unity Connect平台(Connect.unity.com)。
推荐阅读
官方活动
3月18-22日GDC 2019将在旧金山举行,了解Unity活动日程信息,请点击此处。
Unity GDC 2019官网:
https://unity.com/gdc-2019
Unite Shanghai 2019(早鸟票优惠,最后2天)
5月10日-12日上海,Unite大会强势回归。技术门票正在热销中,购票即获指定Asset Store资源商店精品21款资源的5折优惠券。
购票请访问:Unite2019.csdn.net
点击“阅读原文”获取示例项目